#include "idxTest.h"
#include "../idxMasterfile/RegistroMF.h"
#include "../idxMasterfile/IndiceSecuencial.h"
#include "../idxMasterfile/IdxMasterfile.h"
#include "../idxMasterfile/util.h"
#include "testTools.h"
#include <iostream>
#include <vector>
#include <sstream>

using namespace std;

void testMFSerializacion(bool debug)
{
	if (debug) cout << "Origen:" << endl;
	vector<string> autores;
	autores.push_back(string("tAutor1"));
	autores.push_back(string("tAutor2"));
	RegistroMF test("tTitulo", autores,"tIdioma","tAnio","Verso\nLetra de prueba");
	if (debug) cout << test << endl << endl ;

	if (debug)cout << "Resultado en tira de bytes:" << endl;
	char* tira;
	size_t tam = test.serializar(tira);
	if (debug) cout.write(tira, tam);
	if (debug) cout << endl << endl;

	if (debug) cout << "Resultado recuperado:" << endl;
	RegistroMF recup(tira, tam);
	if (debug) cout << recup << endl << endl;
	delete[] tira;

	imprimirSelectivo("Test de serializacion de Masterfile: \t",(test == recup));
}

void testIndexarSec(bool limpiarAlSalir, bool debug)
{
	IndiceSecuencial indice("testIndice.bin");
	size_t id1 = indice.agregar(0);
	size_t id2 = indice.agregar(1024);
	size_t id3 = indice.agregar(65536);
	if (debug) cout << "Posiciones agregadas: " << 0 << " " << 1024 << " " << 65536 << endl;
	if (debug) cout << "IDs obtenidos: " << id1 << " " << id2 << " " << id3 << endl;
	size_t posDev1 = indice.devolver(id1);
	size_t posDev2 = indice.devolver(id2);
	size_t posDev3 = indice.devolver(id3);

	imprimirSelectivo("\nTest de indexacion secuencial:  \t",(0 == posDev1 && 1024 == posDev2 && 65536 == posDev3));

	if (debug) cout << "Posiciones devueltas: " << posDev1 << " " << posDev2 << " " << posDev3 << endl << endl;
	if (limpiarAlSalir) indice.recrearArchivo();
}

void testIndexarMF(bool limpiarAlSalir, bool debug)
{
	IdxMasterfile idxMF("testIndice.bin", "testMF.bin");

	vector<string> autores1;
	autores1.push_back(string("tAutor1-1"));
	vector<string> autores2;
	autores2.push_back(string("tAutor2-1"));
	autores2.push_back(string("tAutor2-2"));
	vector<string> autores3;
	autores3.push_back(string("tAutor3-1"));
	RegistroMF reg1("tTitulo1", autores1,"tIdioma1","tAnio1","Letra\nde\nprueba1");
	RegistroMF reg2("tTitulo2", autores2,"tIdioma2","tAnio2","Letra\nde\nprueba2");
	RegistroMF reg3("tTitulo3", autores3,"tIdioma3","tAnio3","Letra\nde\nprueba3");
	idxMF.agregar(reg1);
	idxMF.agregar(reg2);
	idxMF.agregar(reg3);
	RegistroMF devuelto;
	idxMF.recuperar(1, devuelto);

	imprimirSelectivo("\nTest de indexacion de Masterfile: \t",(reg2 == devuelto));

	if (debug) cout << "Registro agregado:\n" << reg2 << endl;
	if (debug) cout << "Registro devuelto:\n" << devuelto << endl;
	if (limpiarAlSalir) idxMF.recrearArchivos();
}

void testMFdeArch(bool debug)
{
	stringstream stream1;
	stream1 << "Autor-Anio de grabacion-titulo-idioma del tema\nLetra de la\ncancion";
	stringstream stream2;
	stream2 << "Autora;Autorb-titulo-idioma del tema\nLetra de la cancion";
	RegistroMF reg1(stream1);
	RegistroMF reg2(stream2);

	//(const string titulo, const vector<string> autores,const string idioma, const string anio, const string letra);
	vector<string>autor1;
	autor1.push_back("autor");
	vector<string>autor2;
	autor2.push_back("autora");
	autor2.push_back("autorb");
	RegistroMF reg1cmp("titulo",autor1,"idioma del tema","anio de grabacion","letra de la\ncancion");
	RegistroMF reg2cmp("titulo",autor2,"idioma del tema","","letra de la cancion");

	imprimirSelectivo("\nTest carga de archivo a registro: \t",(reg1 == reg1cmp && reg2 == reg2cmp));
	cout << "\n";

	if (debug) cout << "Registro 1:\n" << reg1 << endl;
	if (debug) cout << "Registro 2:\n" << reg2 << endl;
	if (debug) cout << "Registro comparacion 1:\n" << reg1cmp << endl;
	if (debug) cout << "Registro comparacion 2:\n" << reg2cmp << endl;

}

void testNormalizarFrases(bool debug){

	string text = "ÁáÄä ÉéËë ÍíÏï ÓóÖö ÚúÜü Ññ";   // ÁáÄä ÉéËë ÍíÏï ÓóÖö ÚúÜü Ññ
	string objetivo = "aaaa eeee iiii oooo uuuu nn";

    	if (debug) cout << "\nantes de normalizar: " << text << "\n";
    	normalizarYlimpiar(text);
    	if (debug) cout << "\ndespues de normalizar: " << text << "\n";

    	imprimirSelectivo("\nTest normalizacion de palabras: \t",(text == objetivo));
}
